package jp.aztech.android.kawasakiwelfare;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.widget.TextView;	

/**
 * テロップの TextView
 * 一定周期でテロップの表示が更新される
 * モックアップなので、予め用意されたテロップを使用する
 */
public class TelopView extends TextView {
    private static final String TAG = "TelopView";
    
    /* タイマーハンドラーの識別子 */
    private static final int MSG_WHAT = 1;

	/* Context */    
    private Context mContext;

	/* テロップの配列 */   
	private String[] telops = null;
	
	/* テロップ数 */ 
	private int telop_max = 0; 
	
	/* テロップのポインタ */  
	private int telop_pointer = 0;
	
	/* テロップの表示間隔 */  	  
    private int interval = 1000;
    
    /* タイマーハンドラーの開始フラグ */ 
    private boolean started_flag = false;
    
    /* タイマーハンドラーの実行中フラグ */ 
    private boolean running_flag = false;
	
	/**
	 * ===コンストラクタ ===
	 */ 
    public TelopView(Context context) {
        super(context);
        initView(context);
    }

	/**
	 * ===コンストラクタ ===
	 */ 
    public TelopView(Context context, AttributeSet attrs) {
        super(context, attrs);	
        initView(context);
    }

	/**
	 * ===コンストラクタ ===
	 */ 
    public TelopView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView(context);
	}

	/**
	 * 初期設定；テロップ情報の読出し
	 */ 
    private void initView(Context context) {
    	mContext = context;
    }    

	/**
	 * テロップの表示間隔を設定する
	 */         
    public void setInterval( int sec ) {
		interval = 1000 * sec;
    }

	/**
	 * タイマーハンドラーを開始する
	 */     
    public void start() {
    	readFile();
    	drawText();
        started_flag = true;
        updateRunning();
    }

	/**
	 * テロップ情報を Assets ファイルから読出す
	 */ 
    private void readFile() {
    	FileUtility file = new FileUtility( mContext );
    	telops = file.readAssetsFileLines( "telop.txt" );
		if ( telops != null ) {
    		telop_max = telops.length - 1;
    	}
    }
    
	/**
	 * タイマーハンドラーを停止する
	 */     
    public void stop() {
        started_flag = false;
        updateRunning();
    }

	/**
	 * テロップの表示を更新する
	 */
    private synchronized void updateText() {
    	telop_pointer ++;
		if ( telop_pointer > telop_max ) {
			telop_pointer = 0;
		}
    	drawText();
    }

	/**
	 * テロップを表示する
	 */
	private void drawText() {
	    setText( telops[ telop_pointer ] );	
    } 

	/**
	 * タイマーハンドラーを更新する
	 */ 
    private void updateRunning() {
        boolean running = started_flag;
        	
        // 開始フラグ の状態が変化したとき
        if (running != running_flag) {

           // 実行中であれば、テロップの表示を更新し、ハンドラーを再起動する
            if (running) {
                updateText();
                mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_WHAT), interval ); 
                
			// 実行中でなければ、ハンドラーを停止する                
             } else {
                mHandler.removeMessages(MSG_WHAT);
            }
            
            running_flag = running;
        }
    }

	/**
	 * タイマーハンドラーのクラス
	 */    
    private Handler mHandler = new Handler() {
        public void handleMessage(Message m) {
            // 実行中であれば、テロップの表示を更新し、ハンドラーを再起動する
            if (running_flag) {
                updateText();
                sendMessageDelayed(Message.obtain(this, MSG_WHAT), interval );
            }
        }
    };
    
}
